int sendsize;
int recvsize;
int trailing_bytes;
+ const char *text; /* Textual description for debugging */
};
struct dg100_command dg100_commands[] = {
- { dg100cmd_getconfig, 0, 44+2, 2 },
- { dg100cmd_setconfig, 41, 4+2, 2 },
+ { dg100cmd_getconfig, 0, 44+2, 2, "getconfig" },
+ { dg100cmd_setconfig, 41, 4+2, 2, "setconfig" },
/* the getfileheader answer has variable length, -1 is a dummy value */
- { dg100cmd_getfileheader, 2, -1 , 2 },
- { dg100cmd_getfile, 2, 1024+2, 2 },
- { dg100cmd_erase, 2, 4+2, 2 },
- { dg100cmd_getid, 0, 8+2, 2 },
- { dg100cmd_setid, 8, 4+2, 2 },
- { dg100cmd_gpsmouse, 1, 0 , 0 }
+ { dg100cmd_getfileheader, 2, -1 , 2, "getfileheader" },
+ { dg100cmd_getfile, 2, 1024+2, 2, "getfile" },
+ { dg100cmd_erase, 2, 4+2, 2, "erase" },
+ { dg100cmd_getid, 0, 8+2, 2, "getid" },
+ { dg100cmd_setid, 8, 4+2, 2, "setid" },
+ { dg100cmd_gpsmouse, 1, 0 , 0, "gpsmouse" }
};
const unsigned dg100_numcommands = sizeof(dg100_commands) / sizeof(dg100_commands[0]);
static void
dg100_debug(const char *hdr, int include_nl, size_t sz, unsigned char *buf)
{
- int i;
+ int i;
- if (global_opts.debug_level < 1) return;
+ /* Only give byte dumps for higher debug levels */
+ if (global_opts.debug_level < 5) {
+ return;
+ }
- fprintf(stderr, "%s", hdr);
-
- for (i = 0; i < sz; i++) {
- fprintf(stderr, "%02x ", buf[i]);
- }
+ fprintf(stderr, "%s", hdr);
+
+ for (i = 0; i < sz; i++) {
+ fprintf(stderr, "%02x ", buf[i]);
+ }
- if (include_nl) {
- fprintf(stderr, "\n");
- }
+ if (include_nl) {
+ fprintf(stderr, "\n");
+ }
+}
+
+static void
+dg100_log(const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ if (global_opts.debug_level < 1) {
+ return;
+ }
+
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
}
be_write16(frame + framelen - 2, 0xB0B3);
n = gbser_write(serial_handle, frame, framelen);
- dg100_debug(n == 0 ? "Sent: " : "Error Sending:", 1, framelen, frame);
+
+ if (global_opts.debug_level) {
+ struct dg100_command *cmdp = dg100_findcmd(cmd);
+
+ dg100_debug(n == 0 ? "Sent: " : "Error Sending:",
+ 1, framelen, frame);
+ dg100_log("TX: Frame Start %02x %02x Payload_Len %04x Cmd: %s\n",
+ frame[0], frame[1], payload_len, cmdp->text);
+ }
+
if (n == gbser_ERROR) {
fatal("dg_100_send: write failed\n");
}
/* consume input until frame head sequence 0xA0A2 was received */
frame_head = 0;
- dg100_debug("Receiving ", 0, 0, NULL);
+ dg100_debug("Receiving ", 0, 0, NULL);
do {
c = dg100_recv_byte();
- dg100_debug("", 0, 1, &c);
+ dg100_debug("", 0, 1, &c);
frame_head <<= 8;
frame_head |= c;
/* read Payload Length, Command ID, and two further bytes */
for (i = 2; i < 7; i++) {
buf[i] = dg100_recv_byte();
- dg100_debug("", 0, 1, &buf[i]);
+ dg100_debug("", 0, 1, &buf[i]);
}
payload_len_field = be_read16(buf + 2);
* read the rest of the frame at once using gbser_read_wait(). */
for (i = 7; i < frame_len; i++) {
buf[i] = dg100_recv_byte();
- dg100_debug("", 0, 1, &buf[i]);
+ dg100_debug("", 0, 1, &buf[i]);
}
frame_start_seq = be_read16(buf + 0);
payload_checksum = be_read16(buf + frame_len - 4);
frame_end_seq = be_read16(buf + frame_len - 2);
- /* calculate checksum */
- sum = dg100_checksum(buf + 4, frame_len - 8);
+ dg100_log("RX: Start %04x Len %04x Cmd: %s\n",
+ frame_start_seq, payload_len_field, cmdinfo->text);
+
+ /* calculate checksum */
+ sum = dg100_checksum(buf + 4, frame_len - 8);
if (sum != payload_checksum) {
fatal("checksum mismatch: data sum is 0x%04x, checksum received is 0x%04x\n",
sum, payload_checksum);
h = dynarray16_alloc(headers, numheaders);
for (i = 0; i < numheaders; i++) {
offset = 4 + i * 12;
- //time = be_read32(answer + offset);
- //date = be_read32(answer + offset + 4);
seqnum = be_read32(answer + offset + 8);
- //ti = bintime2utc(date, time);
h[i] = seqnum;
+ if (global_opts.debug_level) {
+ int time = be_read32(answer + offset);
+ int date = be_read32(answer + offset + 4);
+ time_t ti = bintime2utc(date, time);
+ dg100_log("Header #%d: Seq: %d Time: %s",
+ i, seqnum, ctime(&ti));
+ }
}
} while (numheaders != 0);
}